package com.sofun.ai.assistant;

import dev.langchain4j.service.*;

/**
 * AI对话助手，聊天时会创建结构的动态代理对象来进行聊天操作
 * */
public interface RagAssistant {

    String chat(String message);

    /**
     * 流式输出
     * @ SystemMessage 预设角色，告诉大模型，现在是什么角色(预设角色，引导大模型调用fundtion call需要开启chatMemory)
     * @param message 用户问题
     * @param currentDate 当前日期
     * @return
     */
    @SystemMessage("""
                您是“Tuling”航空公司的客户聊天支持代理。请以友好、乐于助人且愉快的方式来回复。
                您正在通过在线聊天系统与客户互动。
                在提供有关预订或取消预订的信息之前，您必须始终从用户处获取以下信息：预订号、客户姓名。
                请讲中文。
                今天的日期是 {{current_date}}.
                """)
    TokenStream stream(@UserMessage String message,@V("current_date") String currentDate);

    /**
     * 聊天
     * @param role 设定角色，通过@V注解替换掉system-message.txt中的role变量
     * @param question 原始问题，通过@V注解替换掉user-message.txt中的question变量
     * @param extraInfo 额外信息
     * @return
     */
    @SystemMessage(fromResource = "prompt/system-message.txt")
    @UserMessage(fromResource = "prompt/user-message.txt")
    @Deprecated
    String chat(
            @V("role") String role,
            @V("question") String question,
            @V("extraInfo") String extraInfo);




/**
     * 聊天流式输出，返回TokenStream
     * @param sessionId 会话id，通过@MemoryId指定
     * @param role 设定角色，通过@V注解替换掉system-message.txt中的role变量
     * @param question 原始问题，通过@V注解替换掉user-message.txt中的question变量
     * @param extraInfo 额外信息
     * @return
 */

    @SystemMessage(fromResource = "prompt/system-message.txt")
    // 注意：UserMessage会在检索增强时被带入到查询条件中，所以尽量不要放太多无关的文本。如果需要可以在RAG中使用ContentInjector
    @UserMessage(fromResource = "prompt/user-message.txt")
    TokenStream chatStreamTokenStream(
            @MemoryId String sessionId,
            @V("role") String role,
            @V("question") String question,
            @V("extraInfo") String extraInfo);
}
